1
2
3
4
5
6
7 package io.vavr.collection;
8
9 import io.vavr.*;
10 import io.vavr.control.Option;
11
12 import java.io.*;
13 import java.util.ArrayList;
14 import java.util.Comparator;
15 import java.util.NoSuchElementException;
16 import java.util.Objects;
17 import java.util.function.*;
18 import java.util.stream.Collector;
19
20
21
22
23
24
25
26 public final class LinkedHashSet<T> implements Set<T>, Serializable {
27
28 private static final long serialVersionUID = 1L;
29
30 private static final LinkedHashSet<?> EMPTY = new LinkedHashSet<>(LinkedHashMap.empty());
31
32 private final LinkedHashMap<T, Object> map;
33
34 private LinkedHashSet(LinkedHashMap<T, Object> map) {
35 this.map = map;
36 }
37
38 @SuppressWarnings("unchecked")
39 public static <T> LinkedHashSet<T> empty() {
40 return (LinkedHashSet<T>) EMPTY;
41 }
42
43 static <T> LinkedHashSet<T> wrap(LinkedHashMap<T, Object> map) {
44 return new LinkedHashSet<>(map);
45 }
46
47
48
49
50
51
52
53
54 public static <T> Collector<T, ArrayList<T>, LinkedHashSet<T>> collector() {
55 final Supplier<ArrayList<T>> supplier = ArrayList::new;
56 final BiConsumer<ArrayList<T>, T> accumulator = ArrayList::add;
57 final BinaryOperator<ArrayList<T>> combiner = (left, right) -> {
58 left.addAll(right);
59 return left;
60 };
61 final Function<ArrayList<T>, LinkedHashSet<T>> finisher = LinkedHashSet::ofAll;
62 return Collector.of(supplier, accumulator, combiner, finisher);
63 }
64
65
66
67
68
69
70
71
72
73
74 @SuppressWarnings("unchecked")
75 public static <T> LinkedHashSet<T> narrow(LinkedHashSet<? extends T> linkedHashSet) {
76 return (LinkedHashSet<T>) linkedHashSet;
77 }
78
79
80
81
82
83
84
85
86 public static <T> LinkedHashSet<T> of(T element) {
87 return LinkedHashSet.<T> empty().add(element);
88 }
89
90
91
92
93
94
95
96
97
98
99
100 @SafeVarargs
101 public static <T> LinkedHashSet<T> of(T... elements) {
102 Objects.requireNonNull(elements, "elements is null");
103 LinkedHashMap<T, Object> map = LinkedHashMap.empty();
104 for (T element : elements) {
105 map = map.put(element, element);
106 }
107 return map.isEmpty() ? LinkedHashSet.empty() : new LinkedHashSet<>(map);
108 }
109
110
111
112
113
114
115
116
117
118
119
120 public static <T> LinkedHashSet<T> tabulate(int n, Function<? super Integer, ? extends T> f) {
121 Objects.requireNonNull(f, "f is null");
122 return Collections.tabulate(n, f, LinkedHashSet.empty(), LinkedHashSet::of);
123 }
124
125
126
127
128
129
130
131
132
133
134 public static <T> LinkedHashSet<T> fill(int n, Supplier<? extends T> s) {
135 Objects.requireNonNull(s, "s is null");
136 return Collections.fill(n, s, LinkedHashSet.empty(), LinkedHashSet::of);
137 }
138
139
140
141
142
143
144
145
146 @SuppressWarnings("unchecked")
147 public static <T> LinkedHashSet<T> ofAll(Iterable<? extends T> elements) {
148 Objects.requireNonNull(elements, "elements is null");
149 if (elements instanceof LinkedHashSet) {
150 return (LinkedHashSet<T>) elements;
151 } else {
152 final LinkedHashMap<T, Object> mao = addAll(LinkedHashMap.empty(), elements);
153 return mao.isEmpty() ? empty() : new LinkedHashSet<>(mao);
154 }
155 }
156
157
158
159
160
161
162
163
164 public static <T> LinkedHashSet<T> ofAll(java.util.stream.Stream<? extends T> javaStream) {
165 Objects.requireNonNull(javaStream, "javaStream is null");
166 return ofAll(Iterator.ofAll(javaStream.iterator()));
167 }
168
169
170
171
172
173
174
175
176 public static LinkedHashSet<Boolean> ofAll(boolean... elements) {
177 Objects.requireNonNull(elements, "elements is null");
178 return LinkedHashSet.ofAll(Iterator.ofAll(elements));
179 }
180
181
182
183
184
185
186
187
188 public static LinkedHashSet<Byte> ofAll(byte... elements) {
189 Objects.requireNonNull(elements, "elements is null");
190 return LinkedHashSet.ofAll(Iterator.ofAll(elements));
191 }
192
193
194
195
196
197
198
199
200 public static LinkedHashSet<Character> ofAll(char... elements) {
201 Objects.requireNonNull(elements, "elements is null");
202 return LinkedHashSet.ofAll(Iterator.ofAll(elements));
203 }
204
205
206
207
208
209
210
211
212 public static LinkedHashSet<Double> ofAll(double... elements) {
213 Objects.requireNonNull(elements, "elements is null");
214 return LinkedHashSet.ofAll(Iterator.ofAll(elements));
215 }
216
217
218
219
220
221
222
223
224 public static LinkedHashSet<Float> ofAll(float... elements) {
225 Objects.requireNonNull(elements, "elements is null");
226 return LinkedHashSet.ofAll(Iterator.ofAll(elements));
227 }
228
229
230
231
232
233
234
235
236 public static LinkedHashSet<Integer> ofAll(int... elements) {
237 Objects.requireNonNull(elements, "elements is null");
238 return LinkedHashSet.ofAll(Iterator.ofAll(elements));
239 }
240
241
242
243
244
245
246
247
248 public static LinkedHashSet<Long> ofAll(long... elements) {
249 Objects.requireNonNull(elements, "elements is null");
250 return LinkedHashSet.ofAll(Iterator.ofAll(elements));
251 }
252
253
254
255
256
257
258
259
260 public static LinkedHashSet<Short> ofAll(short... elements) {
261 Objects.requireNonNull(elements, "elements is null");
262 return LinkedHashSet.ofAll(Iterator.ofAll(elements));
263 }
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281 public static LinkedHashSet<Integer> range(int from, int toExclusive) {
282 return LinkedHashSet.ofAll(Iterator.range(from, toExclusive));
283 }
284
285 public static LinkedHashSet<Character> range(char from, char toExclusive) {
286 return LinkedHashSet.ofAll(Iterator.range(from, toExclusive));
287 }
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311 public static LinkedHashSet<Integer> rangeBy(int from, int toExclusive, int step) {
312 return LinkedHashSet.ofAll(Iterator.rangeBy(from, toExclusive, step));
313 }
314
315 public static LinkedHashSet<Character> rangeBy(char from, char toExclusive, int step) {
316 return LinkedHashSet.ofAll(Iterator.rangeBy(from, toExclusive, step));
317 }
318
319 @GwtIncompatible
320 public static LinkedHashSet<Double> rangeBy(double from, double toExclusive, double step) {
321 return LinkedHashSet.ofAll(Iterator.rangeBy(from, toExclusive, step));
322 }
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340 public static LinkedHashSet<Long> range(long from, long toExclusive) {
341 return LinkedHashSet.ofAll(Iterator.range(from, toExclusive));
342 }
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366 public static LinkedHashSet<Long> rangeBy(long from, long toExclusive, long step) {
367 return LinkedHashSet.ofAll(Iterator.rangeBy(from, toExclusive, step));
368 }
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386 public static LinkedHashSet<Integer> rangeClosed(int from, int toInclusive) {
387 return LinkedHashSet.ofAll(Iterator.rangeClosed(from, toInclusive));
388 }
389
390 public static LinkedHashSet<Character> rangeClosed(char from, char toInclusive) {
391 return LinkedHashSet.ofAll(Iterator.rangeClosed(from, toInclusive));
392 }
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416 public static LinkedHashSet<Integer> rangeClosedBy(int from, int toInclusive, int step) {
417 return LinkedHashSet.ofAll(Iterator.rangeClosedBy(from, toInclusive, step));
418 }
419
420 public static LinkedHashSet<Character> rangeClosedBy(char from, char toInclusive, int step) {
421 return LinkedHashSet.ofAll(Iterator.rangeClosedBy(from, toInclusive, step));
422 }
423
424 @GwtIncompatible
425 public static LinkedHashSet<Double> rangeClosedBy(double from, double toInclusive, double step) {
426 return LinkedHashSet.ofAll(Iterator.rangeClosedBy(from, toInclusive, step));
427 }
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445 public static LinkedHashSet<Long> rangeClosed(long from, long toInclusive) {
446 return LinkedHashSet.ofAll(Iterator.rangeClosed(from, toInclusive));
447 }
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471 public static LinkedHashSet<Long> rangeClosedBy(long from, long toInclusive, long step) {
472 return LinkedHashSet.ofAll(Iterator.rangeClosedBy(from, toInclusive, step));
473 }
474
475 @Override
476 public LinkedHashSet<T> add(T element) {
477 return contains(element) ? this : new LinkedHashSet<>(map.put(element, element));
478 }
479
480 @Override
481 public LinkedHashSet<T> addAll(Iterable<? extends T> elements) {
482 Objects.requireNonNull(elements, "elements is null");
483 if (isEmpty() && elements instanceof LinkedHashSet) {
484 @SuppressWarnings("unchecked")
485 final LinkedHashSet<T> set = (LinkedHashSet<T>) elements;
486 return set;
487 }
488 final LinkedHashMap<T, Object> that = addAll(map, elements);
489 if (that.size() == map.size()) {
490 return this;
491 } else {
492 return new LinkedHashSet<>(that);
493 }
494 }
495
496 @Override
497 public <R> LinkedHashSet<R> collect(PartialFunction<? super T, ? extends R> partialFunction) {
498 return ofAll(iterator().<R> collect(partialFunction));
499 }
500
501 @Override
502 public boolean contains(T element) {
503 return map.get(element).isDefined();
504 }
505
506 @Override
507 public LinkedHashSet<T> diff(Set<? extends T> elements) {
508 Objects.requireNonNull(elements, "elements is null");
509 if (isEmpty() || elements.isEmpty()) {
510 return this;
511 } else {
512 return removeAll(elements);
513 }
514 }
515
516 @Override
517 public LinkedHashSet<T> distinct() {
518 return this;
519 }
520
521 @Override
522 public LinkedHashSet<T> distinctBy(Comparator<? super T> comparator) {
523 Objects.requireNonNull(comparator, "comparator is null");
524 return LinkedHashSet.ofAll(iterator().distinctBy(comparator));
525 }
526
527 @Override
528 public <U> LinkedHashSet<T> distinctBy(Function<? super T, ? extends U> keyExtractor) {
529 Objects.requireNonNull(keyExtractor, "keyExtractor is null");
530 return LinkedHashSet.ofAll(iterator().distinctBy(keyExtractor));
531 }
532
533 @Override
534 public LinkedHashSet<T> drop(int n) {
535 if (n <= 0) {
536 return this;
537 } else {
538 return LinkedHashSet.ofAll(iterator().drop(n));
539 }
540 }
541
542 @Override
543 public LinkedHashSet<T> dropRight(int n) {
544 if (n <= 0) {
545 return this;
546 } else {
547 return LinkedHashSet.ofAll(iterator().dropRight(n));
548 }
549 }
550
551 @Override
552 public LinkedHashSet<T> dropUntil(Predicate<? super T> predicate) {
553 Objects.requireNonNull(predicate, "predicate is null");
554 return dropWhile(predicate.negate());
555 }
556
557 @Override
558 public LinkedHashSet<T> dropWhile(Predicate<? super T> predicate) {
559 Objects.requireNonNull(predicate, "predicate is null");
560 final LinkedHashSet<T> dropped = LinkedHashSet.ofAll(iterator().dropWhile(predicate));
561 return dropped.length() == length() ? this : dropped;
562 }
563
564 @Override
565 public LinkedHashSet<T> filter(Predicate<? super T> predicate) {
566 Objects.requireNonNull(predicate, "predicate is null");
567 final LinkedHashSet<T> filtered = LinkedHashSet.ofAll(iterator().filter(predicate));
568 return filtered.length() == length() ? this : filtered;
569 }
570
571 @Override
572 public <U> LinkedHashSet<U> flatMap(Function<? super T, ? extends Iterable<? extends U>> mapper) {
573 Objects.requireNonNull(mapper, "mapper is null");
574 if (isEmpty()) {
575 return empty();
576 } else {
577 final LinkedHashMap<U, Object> that = foldLeft(LinkedHashMap.empty(),
578 (tree, t) -> addAll(tree, mapper.apply(t)));
579 return new LinkedHashSet<>(that);
580 }
581 }
582
583 @Override
584 public <U> U foldRight(U zero, BiFunction<? super T, ? super U, ? extends U> f) {
585 Objects.requireNonNull(f, "f is null");
586 return iterator().foldRight(zero, f);
587 }
588
589 @Override
590 public <C> Map<C, LinkedHashSet<T>> groupBy(Function<? super T, ? extends C> classifier) {
591 return Collections.groupBy(this, classifier, LinkedHashSet::ofAll);
592 }
593
594 @Override
595 public Iterator<LinkedHashSet<T>> grouped(int size) {
596 return sliding(size, size);
597 }
598
599 @Override
600 public boolean hasDefiniteSize() {
601 return true;
602 }
603
604 @Override
605 public T head() {
606 if (map.isEmpty()) {
607 throw new NoSuchElementException("head of empty set");
608 }
609 return iterator().next();
610 }
611
612 @Override
613 public Option<T> headOption() {
614 return iterator().headOption();
615 }
616
617 @Override
618 public LinkedHashSet<T> init() {
619 if (map.isEmpty()) {
620 throw new UnsupportedOperationException("tail of empty set");
621 } else {
622 return new LinkedHashSet<>(map.init());
623 }
624 }
625
626 @Override
627 public Option<LinkedHashSet<T>> initOption() {
628 return isEmpty() ? Option.none() : Option.some(init());
629 }
630
631 @Override
632 public LinkedHashSet<T> intersect(Set<? extends T> elements) {
633 Objects.requireNonNull(elements, "elements is null");
634 if (isEmpty() || elements.isEmpty()) {
635 return empty();
636 } else {
637 return retainAll(elements);
638 }
639 }
640
641
642
643
644
645
646 @Override
647 public boolean isAsync() {
648 return false;
649 }
650
651 @Override
652 public boolean isEmpty() {
653 return map.isEmpty();
654 }
655
656
657
658
659
660
661 @Override
662 public boolean isLazy() {
663 return false;
664 }
665
666 @Override
667 public boolean isTraversableAgain() {
668 return true;
669 }
670
671 @Override
672 public boolean isSequential() {
673 return true;
674 }
675
676 @Override
677 public Iterator<T> iterator() {
678 return map.iterator().map(t -> t._1);
679 }
680
681 @Override
682 public int length() {
683 return map.size();
684 }
685
686 @Override
687 public <U> LinkedHashSet<U> map(Function<? super T, ? extends U> mapper) {
688 Objects.requireNonNull(mapper, "mapper is null");
689 if (isEmpty()) {
690 return empty();
691 } else {
692 final LinkedHashMap<U, Object> that = foldLeft(LinkedHashMap.empty(), (tree, t) -> {
693 final U u = mapper.apply(t);
694 return tree.put(u, u);
695 });
696 return new LinkedHashSet<>(that);
697 }
698 }
699
700 @Override
701 public String mkString(CharSequence prefix, CharSequence delimiter, CharSequence suffix) {
702 return iterator().mkString(prefix, delimiter, suffix);
703 }
704
705 @Override
706 public LinkedHashSet<T> orElse(Iterable<? extends T> other) {
707 return isEmpty() ? ofAll(other) : this;
708 }
709
710 @Override
711 public LinkedHashSet<T> orElse(Supplier<? extends Iterable<? extends T>> supplier) {
712 return isEmpty() ? ofAll(supplier.get()) : this;
713 }
714
715 @Override
716 public Tuple2<LinkedHashSet<T>, LinkedHashSet<T>> partition(Predicate<? super T> predicate) {
717 Objects.requireNonNull(predicate, "predicate is null");
718 final Tuple2<Iterator<T>, Iterator<T>> p = iterator().partition(predicate);
719 return Tuple.of(LinkedHashSet.ofAll(p._1), LinkedHashSet.ofAll(p._2));
720 }
721
722 @Override
723 public LinkedHashSet<T> peek(Consumer<? super T> action) {
724 Objects.requireNonNull(action, "action is null");
725 if (!isEmpty()) {
726 action.accept(iterator().head());
727 }
728 return this;
729 }
730
731 @Override
732 public LinkedHashSet<T> remove(T element) {
733 final LinkedHashMap<T, Object> newMap = map.remove(element);
734 return (newMap == map) ? this : new LinkedHashSet<>(newMap);
735 }
736
737 @Override
738 public LinkedHashSet<T> removeAll(Iterable<? extends T> elements) {
739 return Collections.removeAll(this, elements);
740 }
741
742 @Override
743 public LinkedHashSet<T> replace(T currentElement, T newElement) {
744 if (!Objects.equals(currentElement, newElement) && contains(currentElement)) {
745 final Tuple2<T, Object> currentPair = Tuple.of(currentElement, currentElement);
746 final Tuple2<T, Object> newPair = Tuple.of(newElement, newElement);
747 final LinkedHashMap<T, Object> newMap = map.replace(currentPair, newPair);
748 return new LinkedHashSet<>(newMap);
749 } else {
750 return this;
751 }
752 }
753
754 @Override
755 public LinkedHashSet<T> replaceAll(T currentElement, T newElement) {
756 return replace(currentElement, newElement);
757 }
758
759 @Override
760 public LinkedHashSet<T> retainAll(Iterable<? extends T> elements) {
761 return Collections.retainAll(this, elements);
762 }
763
764 @Override
765 public LinkedHashSet<T> scan(T zero, BiFunction<? super T, ? super T, ? extends T> operation) {
766 return scanLeft(zero, operation);
767 }
768
769 @Override
770 public <U> LinkedHashSet<U> scanLeft(U zero, BiFunction<? super U, ? super T, ? extends U> operation) {
771 return Collections.scanLeft(this, zero, operation, LinkedHashSet::ofAll);
772 }
773
774 @Override
775 public <U> LinkedHashSet<U> scanRight(U zero, BiFunction<? super T, ? super U, ? extends U> operation) {
776 return Collections.scanRight(this, zero, operation, LinkedHashSet::ofAll);
777 }
778
779 @Override
780 public Iterator<LinkedHashSet<T>> slideBy(Function<? super T, ?> classifier) {
781 return iterator().slideBy(classifier).map(LinkedHashSet::ofAll);
782 }
783
784 @Override
785 public Iterator<LinkedHashSet<T>> sliding(int size) {
786 return sliding(size, 1);
787 }
788
789 @Override
790 public Iterator<LinkedHashSet<T>> sliding(int size, int step) {
791 return iterator().sliding(size, step).map(LinkedHashSet::ofAll);
792 }
793
794 @Override
795 public Tuple2<LinkedHashSet<T>, LinkedHashSet<T>> span(Predicate<? super T> predicate) {
796 Objects.requireNonNull(predicate, "predicate is null");
797 final Tuple2<Iterator<T>, Iterator<T>> t = iterator().span(predicate);
798 return Tuple.of(LinkedHashSet.ofAll(t._1), LinkedHashSet.ofAll(t._2));
799 }
800
801 @Override
802 public LinkedHashSet<T> tail() {
803 if (map.isEmpty()) {
804 throw new UnsupportedOperationException("tail of empty set");
805 }
806 return remove(head());
807 }
808
809 @Override
810 public Option<LinkedHashSet<T>> tailOption() {
811 return isEmpty() ? Option.none() : Option.some(tail());
812 }
813
814 @Override
815 public LinkedHashSet<T> take(int n) {
816 if (map.size() <= n) {
817 return this;
818 }
819 return LinkedHashSet.ofAll(() -> iterator().take(n));
820 }
821
822 @Override
823 public LinkedHashSet<T> takeRight(int n) {
824 if (map.size() <= n) {
825 return this;
826 }
827 return LinkedHashSet.ofAll(() -> iterator().takeRight(n));
828 }
829
830 @Override
831 public LinkedHashSet<T> takeUntil(Predicate<? super T> predicate) {
832 Objects.requireNonNull(predicate, "predicate is null");
833 return takeWhile(predicate.negate());
834 }
835
836 @Override
837 public LinkedHashSet<T> takeWhile(Predicate<? super T> predicate) {
838 Objects.requireNonNull(predicate, "predicate is null");
839 final LinkedHashSet<T> taken = LinkedHashSet.ofAll(iterator().takeWhile(predicate));
840 return taken.length() == length() ? this : taken;
841 }
842
843
844
845
846
847
848
849
850
851 public <U> U transform(Function<? super LinkedHashSet<T>, ? extends U> f) {
852 Objects.requireNonNull(f, "f is null");
853 return f.apply(this);
854 }
855
856 @Override
857 public java.util.LinkedHashSet<T> toJavaSet() {
858 return toJavaSet(java.util.LinkedHashSet::new);
859 }
860
861 @SuppressWarnings("unchecked")
862 @Override
863 public LinkedHashSet<T> union(Set<? extends T> elements) {
864 Objects.requireNonNull(elements, "elements is null");
865 if (isEmpty()) {
866 if (elements instanceof LinkedHashSet) {
867 return (LinkedHashSet<T>) elements;
868 } else {
869 return LinkedHashSet.ofAll(elements);
870 }
871 } else if (elements.isEmpty()) {
872 return this;
873 } else {
874 final LinkedHashMap<T, Object> that = addAll(map, elements);
875 if (that.size() == map.size()) {
876 return this;
877 } else {
878 return new LinkedHashSet<>(that);
879 }
880 }
881 }
882
883 @Override
884 public <T1, T2> Tuple2<LinkedHashSet<T1>, LinkedHashSet<T2>> unzip(
885 Function<? super T, Tuple2<? extends T1, ? extends T2>> unzipper) {
886 Objects.requireNonNull(unzipper, "unzipper is null");
887 final Tuple2<Iterator<T1>, Iterator<T2>> t = iterator().unzip(unzipper);
888 return Tuple.of(LinkedHashSet.ofAll(t._1), LinkedHashSet.ofAll(t._2));
889 }
890
891 @Override
892 public <T1, T2, T3> Tuple3<LinkedHashSet<T1>, LinkedHashSet<T2>, LinkedHashSet<T3>> unzip3(
893 Function<? super T, Tuple3<? extends T1, ? extends T2, ? extends T3>> unzipper) {
894 Objects.requireNonNull(unzipper, "unzipper is null");
895 final Tuple3<Iterator<T1>, Iterator<T2>, Iterator<T3>> t = iterator().unzip3(unzipper);
896 return Tuple.of(LinkedHashSet.ofAll(t._1), LinkedHashSet.ofAll(t._2), LinkedHashSet.ofAll(t._3));
897 }
898
899 @Override
900 public <U> LinkedHashSet<Tuple2<T, U>> zip(Iterable<? extends U> that) {
901 return zipWith(that, Tuple::of);
902 }
903
904 @Override
905 public <U, R> LinkedHashSet<R> zipWith(Iterable<? extends U> that, BiFunction<? super T, ? super U, ? extends R> mapper) {
906 Objects.requireNonNull(that, "that is null");
907 Objects.requireNonNull(mapper, "mapper is null");
908 return LinkedHashSet.ofAll(iterator().zipWith(that, mapper));
909 }
910
911 @Override
912 public <U> LinkedHashSet<Tuple2<T, U>> zipAll(Iterable<? extends U> that, T thisElem, U thatElem) {
913 Objects.requireNonNull(that, "that is null");
914 return LinkedHashSet.ofAll(iterator().zipAll(that, thisElem, thatElem));
915 }
916
917 @Override
918 public LinkedHashSet<Tuple2<T, Integer>> zipWithIndex() {
919 return zipWithIndex(Tuple::of);
920 }
921
922 @Override
923 public <U> LinkedHashSet<U> zipWithIndex(BiFunction<? super T, ? super Integer, ? extends U> mapper) {
924 Objects.requireNonNull(mapper, "mapper is null");
925 return LinkedHashSet.ofAll(iterator().zipWithIndex(mapper));
926 }
927
928
929
930 @Override
931 public boolean equals(Object o) {
932 return Collections.equals(this, o);
933 }
934
935 @Override
936 public int hashCode() {
937 return Collections.hashUnordered(this);
938 }
939
940 @Override
941 public String stringPrefix() {
942 return "LinkedHashSet";
943 }
944
945 @Override
946 public String toString() {
947 return mkString(stringPrefix() + "(", ", ", ")");
948 }
949
950 private static <T> LinkedHashMap<T, Object> addAll(LinkedHashMap<T, Object> initial,
951 Iterable<? extends T> additional) {
952 LinkedHashMap<T, Object> that = initial;
953 for (T t : additional) {
954 that = that.put(t, t);
955 }
956 return that;
957 }
958
959
960
961
962
963
964
965
966
967
968
969 @GwtIncompatible("The Java serialization protocol is explicitly not supported")
970 private Object writeReplace() {
971 return new SerializationProxy<>(this.map);
972 }
973
974
975
976
977
978
979
980
981
982 @GwtIncompatible("The Java serialization protocol is explicitly not supported")
983 private void readObject(ObjectInputStream stream) throws InvalidObjectException {
984 throw new InvalidObjectException("Proxy required");
985 }
986
987
988
989
990
991
992
993
994
995 @GwtIncompatible("The Java serialization protocol is explicitly not supported")
996 private static final class SerializationProxy<T> implements Serializable {
997
998 private static final long serialVersionUID = 1L;
999
1000
1001 private transient LinkedHashMap<T, Object> map;
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011 SerializationProxy(LinkedHashMap<T, Object> map) {
1012 this.map = map;
1013 }
1014
1015
1016
1017
1018
1019
1020
1021 private void writeObject(ObjectOutputStream s) throws IOException {
1022 s.defaultWriteObject();
1023 s.writeInt(map.size());
1024 for (Tuple2<T, Object> e : map) {
1025 s.writeObject(e._1);
1026 }
1027 }
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037 private void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException {
1038 s.defaultReadObject();
1039 final int size = s.readInt();
1040 if (size < 0) {
1041 throw new InvalidObjectException("No elements");
1042 }
1043 LinkedHashMap<T, Object> temp = LinkedHashMap.empty();
1044 for (int i = 0; i < size; i++) {
1045 @SuppressWarnings("unchecked")
1046 final T element = (T) s.readObject();
1047 temp = temp.put(element, element);
1048 }
1049 map = temp;
1050 }
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061 private Object readResolve() {
1062 return map.isEmpty() ? LinkedHashSet.empty() : new LinkedHashSet<>(map);
1063 }
1064 }
1065 }